package znajdowanieKrzywychZamknietych;
import java.util.ArrayList;

import typydanych.ObszarCyfry;


public class UstalaniePozycjiKrzywejZamknietej {
	public static final int BRAK_KRZYWYCH = -1;
	public static final int KRZYWA_NA_GORZE = 0;
	public static final int KRZYWA_NA_DOLE = 1;
	public static final int KRZYWA_PO_SRODKU = 2;
	
	private ArrayList<Integer> punktyYObszaru = null;
	
	public ArrayList<Integer> getPunktyYObszaru(){
		if(punktyYObszaru == null){
			punktyYObszaru = new ArrayList<Integer>();
		}
		return punktyYObszaru;
	}
	
	private ObszarCyfry obszarCyfry;
	
	public ObszarCyfry getObszarCyfry(){
		return obszarCyfry;
	}
	
	public void setObszarCyfry(ObszarCyfry obszarCyfry){
		this.obszarCyfry = obszarCyfry;
	}

	public int sprawdzGdzieJestKrzywaZamknieta() {
		int iloscPunktowUGory = 0;
		int iloscPunktowNaDole = 0;
		int indeksPodzialuNaPol = zwrocIndeksPodzialuNaPol();
		double progStosunku = 0.2;
		for (int punkt : getPunktyYObszaru()) {
			if (punkt < indeksPodzialuNaPol) {
				iloscPunktowUGory++;
			} else {
				iloscPunktowNaDole++;
			}
		}

		boolean czyBrakPunktowUGory = iloscPunktowUGory == 0;
		boolean czyBrakPunktowNaDole = iloscPunktowNaDole == 0;
		if (czyBrakPunktowNaDole && czyBrakPunktowUGory) {
			return BRAK_KRZYWYCH;
		}

		if (czyBrakPunktowNaDole) {
			return KRZYWA_NA_GORZE;
		}

		if (czyBrakPunktowUGory) {
			return KRZYWA_NA_DOLE;
		}

		boolean czyWiecejPunktowUGory = (double) iloscPunktowNaDole / (double) iloscPunktowUGory < progStosunku;

		if (czyWiecejPunktowUGory) {
			return KRZYWA_NA_GORZE;
		}

		boolean czyWiecejPunktowNaDole = (double) iloscPunktowUGory / (double) iloscPunktowNaDole < progStosunku;

		if (czyWiecejPunktowNaDole) {
			return KRZYWA_NA_DOLE;
		}

		return KRZYWA_PO_SRODKU;
	}

	/**
	 * 
	 * @return indeks bedący punktem podziału. Indeks ten wchodzi już w zakres dolnej połowy cyfry
	 */
	public int zwrocIndeksPodzialuNaPol() {
		double podzial = (double)((obszarCyfry.getWielkoscObszaru()) + 1) / 2.0;
		return obszarCyfry.getGora() + (int) Math.floor(podzial) + 1;
	}
}
